package com.stu.day14;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * HashMap常用API
 * @author zy
 * @date 2025/2/12 14:13
 */
public class HashMapDemo {
    public static void main(String[] args) {
        //TODO  put(K key, V value)
        //功能：将指定的值与指定的键关联，如果该键已经存在，旧值会被替换。
        //返回值：返回旧值（如果存在），否则返回 null。
        HashMap<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        map.put("three", 3);
        System.out.println("替换并返回旧值(value): "+map.put("one",3));
        System.out.println("新的map: "+map);

        //TODO  get(Object key)
        //功能：根据指定的键获取对应的值。如果键不存在，返回 null。
        //返回值：返回对应的值，或者 null（如果键不存在）。
        System.out.println("根据键返回值: "+map.get("two"));

        //TODO  containsKey(Object key)
        //功能：检查 Map 中是否包含指定的键。
        //返回值：如果 Map 包含该键，返回 true，否则返回 false。
        System.out.println("是否包含指定键: "+map.containsKey("two"));

        //TODO  containsValue(Object value)
        //功能：检查 Map 中是否包含指定的值。
        //返回值：如果 Map 包含该值，返回 true，否则返回 false。
        System.out.println("是否包含指定值: "+map.containsValue(2));

        //TODO  remove(Object key)
        //功能：移除指定键的键值对。
        //返回值：返回移除的值，如果该键不存在，返回 null。
        System.out.println("移除键one对应键值对并返回对应值: "+map.remove("one"));
        System.out.println("移除操作后: "+map);

        int size = map.size(); // size = 2
        boolean isEmpty = map.isEmpty(); // isEmpty = false
//        map.clear(); // 清空所有元素

        //TODO  keySet()**
        //功能：返回 Map 中所有键的 Set 集合。
        //返回值：返回包含所有键的 Set。
        Set<String> keys = map.keySet();
        System.out.println("所有键的Set集合: "+keys);
        // 遍历键
        for (String key : map.keySet()) {
            Integer value = map.get(key);  // 获取对应的值
            System.out.println(key + " = " + value);
        }

        //TODO  values()
        //功能：返回 Map 中所有值的 Collection 集合。
        //返回值：返回包含所有值的 Collection。
        Collection<Integer> values = map.values();
        System.out.println("所有值的Collection集合: "+values);

        //TODO  entrySet()**
        //功能：返回 Map 中所有键值对的 Set 集合。类型是Map.Entry<String, Integer>
        //返回值：返回一个包含所有 Map.Entry<K, V> 对象的 Set。
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        System.out.println("包含所有键值对的Set集合: "+entries);
        // 遍历键值对
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " = " + value);
        }

        //TODO  putIfAbsent(K key, V value)
        //功能：如果指定的键不存在，则将键值对插入 Map 中；如果键存在，什么都不做。
        //返回值：返回旧值（如果存在），否则返回 null。
        System.out.println("此键有旧值,不做操作并返回旧值: "+map.putIfAbsent("three", 2));

        //TODO  replace(K key, V value)
        //功能：如果指定的键存在，替换它的值。
        //返回值：返回旧值（如果存在），否则返回 null。
        map.replace("two", 20);
        System.out.println("two键的值换成20: "+map);

        //TODO  replace(K key, V oldValue, V newValue)
        //功能：如果指定的键的值与给定的 oldValue 相同，才将其替换为 newValue。
        //返回值：如果成功替换，返回 true，否则返回 false。
        boolean replaced = map.replace("two", 20, 22);
        System.out.println("若two键的值为20,则换成22: "+map);

    }
}
